using IGeekFan.AspNetCore.Knife4jUI;
using Microsoft.EntityFrameworkCore;
using NLog.Web;
using Order.Interstructrue;
using Order.Interstructrue.Base;
using System.ComponentModel;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
using Yitter.IdGenerator;

// 创建Web应用程序构建器
var builder = WebApplication.CreateBuilder(args);

// 添加服务到容器中

// 添加控制器服务
builder.Services.AddControllers();
// 了解更多关于配置Swagger/OpenAPI的信息：https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();

// 配置JSON序列化选项
builder.Services.AddControllers().AddJsonOptions(options =>
{
    // 配置JSON序列化选项
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 属性名使用驼峰命名
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; // 字典键使用驼峰命名
    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 属性名大小写不敏感
    options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; // 允许从字符串读取数字
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); // 添加枚举字符串转换器
    // 添加自定义日期时间格式转换器
    options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});

// 配置Swagger文档生成
builder.Services.AddSwaggerGen(x =>
{
    var path = Path.Combine(AppContext.BaseDirectory, "Order.Api.Write.xml");
    x.IncludeXmlComments(path, true); // 包含XML注释
});

// 配置数据库上下文
builder.Services.AddDbContext<MedicalDbContext>(x =>
{
    x.UseMySql(builder.Configuration.GetConnectionString("MySQL"), new MySqlServerVersion("5.7"));
});

// 注册仓储服务
builder.Services.AddScoped(typeof(IBaseRepository<>), typeof(BaseRepository<>));
//builder.Services.AddScoped(typeof(IWmsService), typeof(WmsService));

// 注册退款服务
builder.Services.AddScoped<Order.Api.Write.Service.IRefundService, Order.Api.Write.Service.RefundService>();

// 配置MediatR（中介者模式）
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));

// 配置NLog日志
builder.Host.UseNLog();

// 配置雪花ID生成器
YitIdHelper.SetIdGenerator(new IdGeneratorOptions());

// 配置AutoMapper对象映射
builder.Services.AddAutoMapper(x =>
{

});

// 构建Web应用程序
var app = builder.Build();

// 开发环境配置
if (app.Environment.IsDevelopment())
{
    app.UseSwagger(); // 启用Swagger
    app.UseKnife4UI(); // 启用Knife4j UI
    app.UseSwaggerUI(); // 启用Swagger UI
}

// 配置CORS（跨域资源共享）
app.UseCors(x => x.AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod());

// 启用HTTPS重定向
app.UseHttpsRedirection();

// 启用静态文件服务
app.UseStaticFiles();

// 启用授权中间件
app.UseAuthorization();

// 映射控制器路由
app.MapControllers();

// 启动应用程序
app.Run();

/// <summary>
/// 自定义日期时间JSON转换器
/// </summary>
public class DateTimeConverter : JsonConverter<DateTime>
{
    /// <summary>
    /// 从JSON读取DateTime值
    /// </summary>
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            string value = reader.GetString();
            if (DateTime.TryParse(value, out DateTime dateTime))
            {
                return dateTime;
            }
        }
        // 解析失败，返回当前时间
        return DateTime.Now;
    }

    /// <summary>
    /// 将DateTime值写入JSON
    /// </summary>
    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss"));
    }
}